package com.zimug.boot.launch.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;

import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;

@Controller
public class SSEControler {

  public static final ConcurrentHashMap<Long, SseEmitter> sseEmitters
          = new ConcurrentHashMap<>();

  //第2步：接受用户建立长连接，表示该用户已支付，已支付就可以生成订单(未确认状态)
  @GetMapping("/orderpay")
  public SseEmitter orderpay(Long payid) {
    //设置默认的超时时间60秒，超时之后服务端主动关闭连接。
    SseEmitter emitter = new SseEmitter(60 * 1000L);
    sseEmitters.put(payid,emitter);
    emitter.onTimeout(() -> sseEmitters.remove(payid));
    return emitter;
  }


  //第3步：接受支付系统的支付结果告知，表明用户支付成功
  @GetMapping("/payback")
  public void payback (Long payid){
    //把SSE连接取出来
    SseEmitter emitter = sseEmitters.get(payid);
    try {
      //第4步：由服务端告知浏览器端：该用户支付成功了
      emitter.send("用户支付成功"); //触发前端message事件。
      //触发前端自定义的finish事件
      emitter.send(SseEmitter.event().name("finish").id("6666").data("哈哈"));
    } catch (IOException e) {
      emitter.completeWithError(e);   //出发前端onerror事件
    }
  }

}
